<?php
declare(strict_types=1);

namespace App\Utils;

/**
 * @Description 字符或者其他变量的处理
 * @author abell
 * @since 2020-04-28
 */
class StringUtil
{

    /** 重组数组 key => value
     * @param array $data 源数组
     * @param int $key 修改key
     * @param string $value 修改值
     * @param array $return_data 返回数组
     * @Author abell
     * @DateTime 2020-06-03
     * @return
     */
    public function customArrayByKeyValue($data,$key,$value){
        $return_data = array();
        foreach ($data as $datum) {
            $return_data[$datum[$key]] = $datum[$value];
        }
        return $return_data;
    }

    /** 区间整点时间生成
     * @param int $start_time 开始时间
     * @param int $end_time 结束时间
     * @param string $return_str 返回时间类型,默认是时间戳,传字符串则返回日期类型
     * @param bool $return_type 返回类型,默认是false返回数组,true返回逗号拼接字符串
     * @Author abell
     * @DateTime 2020-06-03
     * @return
     */
    public function timeArray($start_time,$end_time,$return_str=null,$return_type=false){
        $right_time_list = array();
        if($return_str){
            // 生成日期类型
            while ($start_time < $end_time){
                array_push($right_time_list,date($return_str,$start_time));
                $start_time += 86400;
            }
        }else{
            // 生成时间戳类型
            while ($start_time < $end_time){
                array_push($right_time_list,strtotime(date('Ymd',$start_time)));
                $start_time += 86400;
            }
        }
        if($return_type){
            return implode(',',$right_time_list);
        }else{
            return $right_time_list;
        }
    }

    /** 二维数组排序
     * @param array $array 排序数组
     * @param string $key 排序数组key
     * @param int $order 排序方式,默认是倒序
     * @Author abell
     * @DateTime 2020-06-01
     * @return array
     */
    public function arrayRandByValue($array,$key,$order=SORT_DESC){
        $count_array = array_column($array,$key);
        array_multisort($count_array,$order,$array);
        return $array;
    }
    /** 形成树状格式
     * @param array $tree
     * @Author abell
     * @DateTime 2020-06-01
     * @return array
     */
    public function arrayToTree($tree,$rootId = 0,$level=1,$is_tree=true) {
        return $is_tree ? $this->arr2tree($tree,$rootId,$level) : $this->array2level($tree,$rootId,$level);
    }

    //形成树状格式
    private function arr2tree($tree, $rootId = 0,$level=1) {
        $return = array();
        foreach($tree as $leaf) {
            if($leaf['pid'] == $rootId) {
                $leaf["level"] = $level;
                foreach($tree as $subleaf) {
                    if($subleaf['pid'] == $leaf['id']) {
                        $leaf['children'] = $this->arr2tree($tree, $leaf['id'],$level+1);
                        break;
                    }
                }
                $return[] = $leaf;
            }
        }
        return $return;
    }

    //数组层级缩进转换
    private function array2level($array, $pid = 0, $level = 1) {
        static $list = [];
        foreach ($array as $v) {
            if ($v['pid'] == $pid) {
                $v['level'] = $level;
                $list[] = $v;
                $this->array2level($array, $v['id'], $level + 1);
            }
        }
        return $list;
    }

    /** 富文本内容图片后处理
     * $update_data['content'] = $this->handleDescriptionHtml($request->input('content'));
     * @Author abell
     * @DateTime 2020-05-27
     * @return string
     */
    public function handleDescriptionHtml($description)
    {
        // 匹配返回富文本里面的图片链接
        $content_decode = htmlspecialchars_decode($description); ///把一些预定义的 HTML 实体转换为字符
        $content_empty = str_replace('&nbsp;','',$content_decode);
        // 判断数组内容是否包含外链
        $img_str_list = explode('<img src="',$content_empty);
        array_shift($img_str_list);
        $image_array = [];
        foreach ($img_str_list as $img_str) {
            $img_urls = explode('"',$img_str);
            array_push($image_array,$img_urls[0]);
        }
        // 下载富文本里面的图片链接到本地
        foreach ($image_array as $img_url) {
            $download_img = make(Upload::class)->download_img($img_url);
            if($download_img['code']){ // 图片下载失败
                return false;
            }else{
                // 替换富文本的内容
                $content_empty = str_replace($img_url,$download_img['data']['imgpath'],$content_empty);
            }
        }
        return $content_empty;
    }

    /** 处理微信的base64编码(判断字符串是否是base64位编码,是就解码,不是就返回原string)
     * @Author abell
     * @DateTime 2020-05-28
     * @param string $str
     * @return string $str
     */
    public function strIsBase64($str){
        if(empty($str)){
            return $str;
        }else{
            if ($this->isUtf8(base64_decode($str)) && base64_decode($str) != ''){
                return base64_decode($str);
            }
            return $str;
        }
    }

    // 是否是base64编码判断
    private function isUtf8($str){
        $len = strlen($str);
        for($i = 0; $i < $len; $i++){
            $c = ord($str[$i]);
            if($c > 128){
                if(($c > 247)){
                    return false;
                }elseif($c > 239){
                    $bytes = 4;
                }elseif($c > 223){
                    $bytes = 3;
                }elseif ($c > 191){
                    $bytes = 2;
                }else{
                    return false;
                }
                if(($i + $bytes) > $len){
                    return false;
                }
                while($bytes > 1){
                    $i++; $b = ord($str[$i]);
                    if($b < 128 || $b > 191){
                        return false;
                    } $bytes--;
                }
            }
        }
        return true;
    }
}

